package com.portalito.jahepi;

import java.io.File;
import java.util.ArrayList;

import com.portalito.jahepi.GPS.Coord;
import com.portalito.jahepi.dto.*;
import com.portalito.jahepi.modelo.DAO;
import com.portalito.jahepi.tarea.SincronizadorService;

import android.app.Application;
import android.content.Intent;
import android.os.Environment;

public class AplicacionBase extends Application {
	
	public final static double VERSION = 1.0;
	public final static String RUTA_IMAGEN = "http://jocapra.portalito.com/erpportalito/android_bridge_areas/images/";
	public final static String RUTA_SERVICIO = "http://erp.portalito.com/erpportalito/android_tickets_mg/";
	public final static File RUTA_SDCARD = Environment.getExternalStorageDirectory();
	public final static String TAG = "AplicacionBase";
	public final static String AGREGADO_INTENT = "agregadoIntent";
	public static boolean DEBUG_ON = false;
	
	private boolean conectado;
	private boolean sincronizadorActivo;
	private DAO dao;
	private GPS gps;
	private Usuario usuario;
	private Coord coord;
	private String androidId;
	private PedidoVenta pedidoVenta;
	private Almacen almacen;
	private Cliente cliente;
	private Producto producto;
	
	@Override
	public void onCreate() {
		super.onCreate();
		dao = new DAO(getApplicationContext());
		conectado = false;
		gps = new GPS(this);
		gps.iniciar();
		androidId = Utils.obtenerAndroidId(this);
		
		if(estaSincronizadorActivo() == false) {
			startService(new Intent(this, SincronizadorService.class));
		}
	}
	
	public boolean estaConectado() {
		return conectado;
	}
	
	public boolean login(String usuario, String clave) {
		Usuario usuarioDto = dao.obtenerUsuario(usuario, Utils.SHA1(clave));
		if(usuarioDto == null) {
			usuarioDto = dao.obtenerUsuario(usuario, clave);
		}
		if(usuarioDto != null) {
			this.usuario = usuarioDto;
			conectado = true;
			return true;
		}
		return false;
	}
	
	public void desconectar() {
		conectado = false;
		usuario = null;
	}
	
	public void setPedidoVenta(PedidoVenta pedidoVenta) {
		this.pedidoVenta = pedidoVenta;
	}
	
	public PedidoVenta getPedidoVenta() {
		return pedidoVenta;
	}
	
	public void removePedidoVenta() {
		this.pedidoVenta = null;
	}
	
	public Usuario getUsuario() {
		return usuario;
	}
	
	public Unidad getUsuarioUnidad() {
		return usuario.getUnidad();
	}
	
	public String getUsuarioUnidadNombre() {
		return getUsuarioUnidad().getNombre();
	}
	
	public boolean tieneUsuarioPermisoPedidoVenta() {
		return usuario.tienePermisoPedidoVenta();
	}
	
	public boolean tieneUsuarioPermisoTicket() {
		return usuario.tienePermisoTicket();
	}
	
	public String getUsuarioNombre() {
		return usuario.getNombre();
	}
	
	public boolean estaSincronizadorActivo() {
		return sincronizadorActivo;
	}

	public void setSincronizadorActivo(boolean sincronizadorActivo) {
		this.sincronizadorActivo = sincronizadorActivo;
	}
	
	public boolean guardarUsuario(Usuario usuario) {
		return dao.guardarUsuario(usuario);
	}
	
	public boolean guardarUnidad(Unidad unidad) {
		return dao.guardarUnidad(unidad);
	}
	
	public boolean guardarCliente(Cliente cliente) {
		return dao.guardarCliente(cliente);
	}
	
	public boolean guardarAlmacen(Almacen almacen) {
		return dao.guardarAlmacen(almacen);
	}
	
	public boolean guardarTicket(Ticket ticket) {
		return dao.guardarTicket(ticket);
	}
	
	public boolean guardarProducto(Producto producto) {
		return dao.guardarProducto(producto);
	}
	
	public boolean guardarPedidoVenta(PedidoVenta pedidoVenta) {
		if(PedidoVenta.esValido(pedidoVenta)) {
			return dao.guardarPedidoVenta(pedidoVenta);
		}
		return false;
	}
	
	public Usuario obtenerUsuario(String usuario) {
		return dao.obtenerUsuario(usuario);
	}
	
	public Unidad obtenerUnidad(String id) {
		return dao.obtenerUnidad(id);
	}
	
	public Producto obtenerProducto(String id) {
		return dao.obtenerProducto(id);
	}
	
	public Cliente obtenerCliente(String id) {
		return dao.obtenerCliente(id);
	}
	
	public ArrayList<Cliente> obtenerClientes() {
		return dao.obtenerClientes();
	}
	
	public Almacen obtenerAlmacen(String id) {
		return dao.obtenerAlmacen(id);
	}
	
	public ArrayList<Producto> obtenerProductosPorCriterio(String criterio) {
		return dao.obtenerProductosPorCriterio(criterio);
	}
	
	public ArrayList<Cliente> obtenerClientesPorCriterio(String criterio) {
		return dao.obtenerClientesPorCriterio(criterio);
	}
	
	public ArrayList<Almacen> obtenerAlmacenesPorUnidad() {
		return dao.obtenerAlmacenesPorUnidad(usuario.getUnidadId());
	}
	
	public ArrayList<Ticket> obbtenerTicketsNoSincronizados() {
		return dao.obtenerTicketsNoSincronizados();
	}
	
	public boolean actualizarTicketComoSincronizado(Ticket ticket) {
		return dao.actualizarTicketComoSincronizado(ticket);
	}
	
	public ArrayList<PedidoVenta> obtenerPedidosVentaNoSincronizados() {
		return dao.obtenerPedidosVentaNoSincronizados();
	}
	
	public boolean actualizarPedidoVentaComoSincronizado(PedidoVenta pedido) {
		return dao.actualizarPedidoVentaComoSincronizado(pedido);
	}
	
	public void borrarProductosExcepto(ArrayList<Producto> productos) {
		dao.borrarProductosExcepto(productos);
	}
	
	public void borrarAlmacenesExcepto(ArrayList<Almacen> almacenes) {
		dao.borrarAlmacenesExcepto(almacenes);
	}
	
	public void borrarClientesExcepto(ArrayList<Cliente> clientes) {
		dao.borrarClientesExcepto(clientes);
	}
	
	public void setCoord(Coord coord) {
		this.coord = coord;
	}
	
	public double getLatitud() {
		if(coord != null) {
			return coord.getLatitud();
		}
		return 0;
	}
	
	public double getLongitud() {
		if(coord != null) {
			return coord.getLongitud();
		}
		return 0;
	}
	
	public String getAndroidId() {
		return androidId;
	}
	
	public ArrayList<Unidad> obtenerUnidadesUsuario() {
		return usuario.getUnidades();
	}
	
	public void setUsuarioUnidad(Unidad unidad) {
		usuario.setUnidad(unidad);
	}

	public Almacen getAlmacen() {
		return almacen;
	}

	public void setAlmacen(Almacen almacen) {
		this.almacen = almacen;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Producto getProducto() {
		return producto;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}
}
